package com.snail.utils;

import com.snail.constants.RedisConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author Monica
 * @description
 * @date 2025/8/21 17:40
 */
@Component
public class RateLimiterUtil {
    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 滑动窗口限流
     *
     * @param key           限流键（如用户ID、IP）
     * @param windowSeconds 窗口时间（秒）
     * @param maxCount      窗口内最大请求数
     * @return 是否允许请求
     */
    public boolean isAllowed(String key, int windowSeconds, int maxCount) {
        String redisKey = RedisConstants.FILE_SYS_RATE_LIMIT + key;
        long currentTime = System.currentTimeMillis() / 1000;
        long windowStart = currentTime - windowSeconds;

        // 1. 移除窗口外的记录
        redisTemplate.opsForZSet().removeRangeByScore(redisKey, 0, windowStart);
        // 2. 设置过期时间（避免内存溢出）
        redisTemplate.expire(redisKey, windowSeconds, TimeUnit.SECONDS);
        // 3. 统计当前窗口内的请求数
        Long count = redisTemplate.opsForZSet().zCard(redisKey);
        if (count != null && count > maxCount) {
            // 4. 允许请求，添加当前时间戳到有序集合
            redisTemplate.opsForZSet().add(redisKey, UUID.randomUUID().toString(), currentTime);
            return true;
        }
        return false;
    }
}
